package cn.heyige.backend.mapper;

import cn.heyige.backend.dto.DivinationFeedbackDTO;
import cn.heyige.backend.entity.DivinationFeedbackDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 占卜反馈Mapper接口
 */
public interface FeedbackMapper extends BaseMapper<DivinationFeedbackDO> {
    
    /**
     * 根据用户ID查询反馈，按创建时间降序排序
     * @param userId 用户ID
     * @return 反馈列表
     */
    @Select("SELECT * FROM divination_feedback WHERE user_id = #{userId} ORDER BY create_time DESC")
    List<DivinationFeedbackDO> findByUserIdOrderByCreatedAtDesc(@Param("userId") Integer userId);
    
    /**
     * 查询所有不同的原始卦象
     * @return 原始卦象列表
     */
    @Select("SELECT DISTINCT original_hexagram FROM divination_feedback WHERE original_hexagram IS NOT NULL")
    List<String> findDistinctOriginalHexagram();
    
    /**
     * 查询所有不同的用户城市
     * @return 用户城市列表
     */
    @Select("SELECT DISTINCT user_city FROM divination_feedback WHERE user_city IS NOT NULL")
    List<String> findDistinctUserCity();
    
    /**
     * 查询所有不同的用户心情
     * @return 用户心情列表
     */
    @Select("SELECT DISTINCT user_mood FROM divination_feedback WHERE user_mood IS NOT NULL")
    List<String> findDistinctUserMood();
    
    /**
     * 统计指定卦象的反馈数量
     * @param originalHexagram 原始卦象
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE original_hexagram = #{originalHexagram}")
    long countByOriginalHexagram(@Param("originalHexagram") String originalHexagram);
    
    /**
     * 统计指定卦象且准确性为指定值的反馈数量
     * @param originalHexagram 原始卦象
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE original_hexagram = #{originalHexagram} AND is_accurate = #{isAccurate}")
    long countByOriginalHexagramAndIsAccurate(@Param("originalHexagram") String originalHexagram, @Param("isAccurate") Boolean isAccurate);
    
    /**
     * 统计指定城市的反馈数量
     * @param userCity 用户城市
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE user_city = #{userCity}")
    long countByUserCity(@Param("userCity") String userCity);
    
    /**
     * 统计指定城市且准确性为指定值的反馈数量
     * @param userCity 用户城市
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE user_city = #{userCity} AND is_accurate = #{isAccurate}")
    long countByUserCityAndIsAccurate(@Param("userCity") String userCity, @Param("isAccurate") Boolean isAccurate);
    
    /**
     * 统计指定心情的反馈数量
     * @param userMood 用户心情
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE user_mood = #{userMood}")
    long countByUserMood(@Param("userMood") String userMood);
    
    /**
     * 统计指定心情且准确性为指定值的反馈数量
     * @param userMood 用户心情
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE user_mood = #{userMood} AND is_accurate = #{isAccurate}")
    long countByUserMoodAndIsAccurate(@Param("userMood") String userMood, @Param("isAccurate") Boolean isAccurate);
    
    /**
     * 统计指定用户的反馈数量
     * @param userId 用户ID
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE user_id = #{userId}")
    long countByUserId(@Param("userId") Integer userId);
    
    /**
     * 统计指定用户且准确性为指定值的反馈数量
     * @param userId 用户ID
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE user_id = #{userId} AND is_accurate = #{isAccurate}")
    long countByUserIdAndIsAccurate(@Param("userId") Integer userId, @Param("isAccurate") Boolean isAccurate);
    
    /**
     * 查询指定城市和卦象的反馈
     * @param userCity 用户城市
     * @param originalHexagram 原始卦象
     * @return 反馈列表
     */
    @Select("SELECT * FROM divination_feedback WHERE user_city = #{userCity} AND original_hexagram = #{originalHexagram}")
    List<DivinationFeedbackDO> findByUserCityAndOriginalHexagram(@Param("userCity") String userCity, @Param("originalHexagram") String originalHexagram);
    
    /**
     * 根据用户ID查询反馈（兼容测试用例）
     * @param userId 用户ID
     * @return 反馈列表
     */
    @Select("SELECT * FROM divination_feedback WHERE user_id = #{userId}")
    List<DivinationFeedbackDO> findByUserId(@Param("userId") Integer userId);
    
    /**
     * 根据创建时间查询反馈
     * @param createdAt 创建时间
     * @return 反馈列表
     */
    @Select("SELECT * FROM divination_feedback WHERE create_time > #{createdAt}")
    List<DivinationFeedbackDO> findByCreatedAtAfter(@Param("createdAt") LocalDateTime createdAt);
    
    /**
     * 计算指定用户的准确率
     * @param userId 用户ID
     * @return 准确率（0.0-1.0），如果没有反馈则返回null
     */
    @Select("SELECT IF(COUNT(*) > 0, CAST(SUM(IF(is_accurate = true, 1, 0)) AS DOUBLE) / COUNT(*), NULL) " +
           "FROM divination_feedback WHERE user_id = #{userId}")
    Double calculateUserAccuracyRate(@Param("userId") Integer userId);
    
    /**
     * 统计指定心情和卦象的反馈数量
     * @param userMood 用户心情
     * @param originalHexagram 原始卦象
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE user_mood = #{userMood} AND original_hexagram = #{originalHexagram}")
    long countByUserMoodAndOriginalHexagram(@Param("userMood") String userMood, @Param("originalHexagram") String originalHexagram);
    
    /**
     * 统计指定心情、卦象且准确性为指定值的反馈数量
     * @param userMood 用户心情
     * @param originalHexagram 原始卦象
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    @Select("SELECT COUNT(*) FROM divination_feedback WHERE user_mood = #{userMood} AND original_hexagram = #{originalHexagram} AND is_accurate = #{isAccurate}")
    long countByUserMoodAndOriginalHexagramAndIsAccurate(@Param("userMood") String userMood, @Param("originalHexagram") String originalHexagram, @Param("isAccurate") Boolean isAccurate);
    
    /**
     * 根据用户ID查询反馈DTO列表
     * @param userId 用户ID
     * @return 反馈DTO列表
     */
    @Select("SELECT * FROM divination_feedback WHERE user_id = #{userId} ORDER BY create_time DESC")
    List<DivinationFeedbackDTO> findFeedbackByUserId(@Param("userId") Integer userId);
}